跳至主要内容

網路爬蟲

初探網路爬蟲​


聽說上學期你們有碰過​


先簡介一下什麼是網路爬蟲​


試想看看有想大量下載圖片​

但你又很懶​


那該怎麼辦呢?


去睡覺吧!​

夢裡甚麼都有​

呸呸呸!!​


簡單來說就是讓你當慣老闆​

使用網路爬蟲來替你工作​


可以做些甚麼呢?​

幫你下載美女的照片、爬文、搶Black pink的票等等​


基本上就是讓爬蟲偽裝成瀏覽器去爬取你要的資料​

或下達指令給爬蟲執行​


爬蟲之前必須知道的事​

  • 會需要先認識網站架構,Ex. HTML
  • 要當個有道德的爬蟲(!?

Selenium

官網介紹

前置作業​

名琮的修復環境筆記

For Linux

  1. 安裝python 環境
sudo apt install python3.9 
apt install pipenv
sudo apt-get install python3-pip

這裡順便提一下pipenv

請使用下列程式碼嘗試安裝 selenium

pip3 install pipenv
pipenv install selenium
pip install selenium

可以先確認是否安裝成功​


下載Chrome Driver​

Here

Chrome -> Setting -> About Chrome -> Chrome Version​

記得對照版本下載​

解壓縮到桌面​


語法教學​


環境設定​

from selenium import webdriver
from selenium.webdriver.support.ui import Select,WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import requests
from bs4 import BeautifulSoup
import io
import time


起手式​

PATH = " " //Chrome Driver的位置
driver = webdriver.Chrome //所需使用的瀏覽器
driver.get(" ") //Chrome Driver要開啟的網頁
Mac的部分可以把Chrome Driver加入到bin的環境變數中​
/usr/local/bin

Example​

Path = "/usr/local/bin/chromedriver.exe"#chromedriver path
driver = webdriver.Chrome()#open browser
driver.get("https://www.dcard.tw/f")
==>開啟Dcard首頁

必備知識​


標籤種類​

常用的會像是name,class,id...​

普通操作​

print(driver.title) //網頁名稱
search = driver.find_element(HTML標籤, "標籤名稱" )
search.clear() //清除預設文字
search.send_keys("搜尋名稱")
time.sleep(秒數) //使爬蟲停等時間
search.send_keys(Keys.RETURN) //按下Enter

Example​

print(driver.title)
search = driver.find_element(By.NAME, "query" )
search.clear()
search.send_keys("比特幣")
time.sleep(3)
search.send_keys(Keys.RETURN)

==>出現有關比特幣的搜尋結果

取得文章標題​

WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "atm_26_loj7t9"))
) //等到讀到指定標籤,在執行下面的程式

titles = driver.find_elements(By.CLASS_NAME, "atm_cs_1urozh")
for title in titles :
print(title.text) //迴圈


來做個好玩東西!​

警告,及免責聲明

以下遊戲內容可能引起部分人們不適
若您對於性別議題 或 性 相關議題有較為強烈的主張,
請在此打住。

此遊戲內容涵意

為一款政治及社會諷刺遊戲
請勿認真對待

來玩個網頁小遊戲​

遊戲網站

若有雷同存屬巧合


先建構環境跟要開的網頁​

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select,WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import requests
from bs4 import BeautifulSoup
import io

PATH = "/usr/local/bin/chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://tsj.tw/")

點擊按鈕位置​

次數​

blow = driver.find_element(By.ID,'click')
blow_count = driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[2]/h4[2]')
tags: 記得最外層要把"蓋成'​

等等? XPath?​

簡單來說就是物件在HTML中的絕對位置​

若要找的東西標籤重複,就可以用來指定位置~​

讀取商品按鈕​

items = []
items.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[4]/td[5]/button[1]'))
items.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[3]/td[5]/button[1]'))
items.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[2]/td[5]/button[1]'))

讀取商品價格​

prices = []
prices.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[4]/td[4]'))
prices.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[3]/td[4]'))
prices.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[2]/td[4]'))

前置點擊器​

actions = ActionChains(driver)#操作滑鼠
for n in range(10):
actions.click(blow)

自動購買道具​

for i in range(10000):
actions.perform() #動作執行
count = int(blow_count.text.replace("您目前擁有", "").replace("技術點", "")) #替換掉字串為空字串只留數字
for j in range(3): #跑三次去比價
price = int(prices[j].text.replace("技術點", ""))
if count >= price: #購買
upgrade_actions = ActionChains(driver)
upgrade_actions.move_to_element(items[j])
upgrade_actions.click()
upgrade_actions.perform() #動作執行
break

全部程式碼​

提醒

本程式碼可能無法在部分電腦環境上面正常執行

github專案範例連結

# Action Chains 自動玩網頁小遊戲
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select,WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import requests
from bs4 import BeautifulSoup
import io

PATH = "/usr/local/bin/chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://tsj.tw/%22)

blow = driver.find_element(By.ID,'click')
blow_count = driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[2]/h4[2]')

items = []
items.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[4]/td[5]/button[1]'))
items.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[3]/td[5]/button[1]'))
items.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[2]/td[5]/button[1]'))

prices = []
prices.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[4]/td[4]'))
prices.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[3]/td[4]'))
prices.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[2]/td[4]'))

actions = ActionChains(driver)

for n in range(10):
# actions.perform()
actions.click(blow)

for i in range(10000):
actions.click(blow)
actions.perform()
count = int(blow_count.text.replace("您目前擁有", "").replace("技術點", ""))
for j in range(3):
price = int(prices[j].text.replace("技術點", ""))
if count >= price:
upgrade_actions = ActionChains(driver)
upgrade_actions.move_to_element(items[j])
upgrade_actions.click()
upgrade_actions.perform()
break

不夠過癮?​

Examples

學長教太爛🥲​

🔥🦐(乾蝦)

期待你們能夠做出🐮🍺的機器人~~​